/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#pragma once


#include "向量.h"

#include "../A_核心/S_Px核心.h"
#include "../../../S_Physics.h"




struct S_Px平面几何体 : public S_物理几何体 {
	physx::PxPlane	m_plane;
	void*	f_get几何体物理对象() { return &m_plane; }
	void	f_set几何体物理数据(void* data);

	bool	f_is空() { 
		if (m_plane.distance(m_plane.n) <= 0) return true;
		else return false; 
	};

	S_Px平面几何体(const vec4& nd);
};




struct S_Px方体几何体 : public S_物理几何体 {
	physx::PxBoxGeometry		m_Gem;
	void* f_get几何体物理对象() { return dynamic_cast<physx::PxBoxGeometry*>(&m_Gem); }
	//void	f_set几何体物理数据(void* data);
	bool	f_is空() {
		if (m_Gem.halfExtents.x > 0.0f && m_Gem.halfExtents.y > 0.0f && m_Gem.halfExtents.z > 0.0f) return true;
		else return false;
	};

	S_Px方体几何体(const vec3& v);
};



struct S_Px凸壳几何体 : public S_物理几何体 {
	physx::PxConvexMesh*			m_Px网格;
	physx::PxConvexMeshGeometry*	m_Geom;
	void*	f_get几何体物理对象() { return dynamic_cast<physx::PxConvexMeshGeometry*>(m_Geom); }

	bool f_is空() {
		if (m_Px网格) return false;
		return true;
	}

	
	S_Px凸壳几何体(S_Px物理引擎核心* core, const S_三角Mesh mesh, const vec3& scale = {1.0,1.0,1.0});
	~S_Px凸壳几何体();

};
#define DEF_PX凸壳碰撞(obj) ( (physx::PxConvexMeshGeometry*)(obj.f_get几何体物理对象()) )




struct S_Px网格几何体 : public S_物理几何体 {
	physx::PxTriangleMesh* m_Px网格;
	physx::PxTriangleMeshGeometry m_Geom;
	void* f_get几何体物理对象() { 
		return &m_Geom; 
	}

	bool f_is空() {
		if(m_Px网格) return false;
		return true;
	}
	
	S_Px网格几何体(S_Px物理引擎核心* core, const S_三角Mesh mesh, bool 动态 = true);
	~S_Px网格几何体();
};


#define DEF_PX几何碰撞(obj) *( (physx::PxTriangleMeshGeometry*)(obj.f_get几何体物理对象()) )
//#define DEF_PX几何碰撞(obj) physx::PxConvexMeshGeometry(*(physx::PxTriangleMeshGeometry*)(obj.f_get几何体物理对象()))









struct S_Px物理材质 : public S_物理材质 {
	physx::PxMaterial*	m_材质;
	void*	f_get物理材质数据() { 
		return m_材质; 
	}
	void	f_set物理材质数据(void* data) ;

	S_Px物理材质(S_Px物理引擎核心* core, float32 静摩擦, float32 动摩擦, float32 恢复系数);
	~S_Px物理材质();
};



#define DEF_PX材质(obj) *( (physx::PxMaterial*)(obj.f_get物理材质数据()) )
//#define DEF_PX材质(obj)  (physx::PxMaterial*)(obj.f_get物理材质数据()) 








